package com.zhang;


import com.zhang.base.List;
import com.zhang.cicle.TwoCycleLinkedList;
import com.zhang.cicle.TwoCycleLinkedList2;

public class Test {
    public static void main(String[] args) {
        josephus();
//        testList(new TwoCycleLinkedList2<>());
//        testList(new TwoLinkedList2<>());
//        testList(new SingleLinkedList<>());
//        testList(new CycleSingleLinkedList2<>());


    }

    static void testList(List<Integer> list) {
        list.add(11);
        list.add(22);
        list.add(33);
        list.add(44);
        list.add(0, 55); // [55, 11, 22, 33, 44]
        System.out.println(list);
        list.add(2, 66); // [55, 11, 66, 22, 33, 44]
        list.add(list.size(), 77); // [55, 11, 66, 22, 33, 44, 77]
        System.out.println(list);
        list.remove(0); // [11, 66, 22, 33, 44, 77]
        System.out.println(list);
        list.remove(2); // [11, 66, 33, 44, 77]
        list.remove(list.size() - 1); // [11, 66, 33, 44]
        System.out.println(list);
        System.out.println(list.indexOf(44));
        Asserts.test(list.indexOf(44) == 3);
        Asserts.test(list.indexOf(22) == List.ELEMENT_NOT_FOUND);
        Asserts.test(list.contains(33));
        Asserts.test(list.get(0) == 11);
        Asserts.test(list.get(1) == 66);
        Asserts.test(list.get(list.size() - 1) == 44);

        System.out.println(list);
    }

    /**
     * 据说著名犹太历史学家Josephus有过以下的故事：在罗马人占领乔塔帕特后，39个犹太人与Josephus及他的朋友躲到一个洞中，
     * 39个犹太人决定宁愿死也不要被敌人抓到，于是决定了一个自杀方式，41个人排成一个圆圈，由第1个人开始报数，
     * 每报数到第3人该人就必须自杀，·然后再由下一个重新报数，直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。
     * 首先从一个人开始，越过k-2个人（因为第一个人已经被越过），并杀掉第k个人。接着，再越过k-1个人，并杀掉第k个人。
     * 这个过程沿着圆圈一直进行，直到最终只剩下一个人留下，这个人就可以继续活着。问题是，给定了和，一开始要站在什么地方才能避免被处决。
     * Josephus要他的朋友先假装遵从，他将朋友与自己安排在第16个与第31个位置，于是逃过了这场死亡游戏。
     */
    static void josephus() {
        TwoCycleLinkedList2<Integer> list = new TwoCycleLinkedList2<>();
        for (int i = 1; i <= 8; i++) {
            list.add(i);
        }
        System.out.println(list);
        // 指向头结点（指向1）
        list.reset();
        while (!list.isEmpty()) {
            list.next();
            list.next();
            System.out.println(list.removeCurrent());
        }
    }
}
